package com.dmatek.uwb.packet.bean;
/***
 * 向量类
 * @author zhangfu
 * @data 2019年6月18日 下午3:50:05
 * @Description
 */
public final class Vector {
	public final static double eps = 1e-10;
	private double x, y;
	public Vector(double x, double y) {
		this.x = x;
		this.y = y;
	}
	/***
	 * 向量相加
	 * @param va
	 * @param vb
	 * @return
	 */
	public Vector add(Vector vb) {
		return new Vector(this.getX() + vb.getX(), this.getY() + vb.getY());
	}
	/***
	 * 向量相减
	 * @param va
	 * @param vb
	 * @return
	 */
	public Vector sub(Vector vb) {
		return new Vector(this.getX() - vb.getX(), this.getY() - vb.getY());
	}
	/***
	 * 相乘
	 * @param va
	 * @param b
	 * @return
	 */
	public Vector mul(double b) {
		return new Vector(this.getX() * b, this.getY() * b);
	}
	/***
	 * 相除
	 * @param va
	 * @param b
	 * @return
	 */
	public Vector div(double b) {
		return new Vector(this.getX() / b, this.getY() / b);
	}
	/***
	 * 判断两个向量是否相等
	 * @param vb
	 * @return
	 */
	public boolean equal(Vector vb) {
		return ((this.getX() == vb.getX()) && (this.getY() == vb.getY()));
	}
	/***
	 * 判断两个向量是否不相等
	 * @param vb
	 * @return
	 */
	public boolean notEqual(Vector vb) {
		return ((this.getX() != vb.getX()) || (this.getX() != vb.getX()));
	}
	/**
	 * 向量点乘
	 * @param vb
	 * @return
	 */
	public double dot(Vector vb) {
		return this.getX() * vb.getX() 
			 + this.getY() * vb.getY();
	}
	/***
	 * 向量长度
	 * @param vb
	 * @return
	 */
	public double length(Vector vb) {
		return Math.sqrt(dot(this));
	}
	/***
	 * 向量叉积
	 * @param vb
	 * @return
	 */
	public double cross(Vector vb) {
		return this.getX() * vb.getY() - vb.getX() * this.getY();
	}
	/***
	 * 向量角度
	 * @param vb
	 * @return
	 */
	public double angle(Vector vb) {
		double cosQ = this.dot(vb)/(length(this) * length(vb));
		return Math.acos(cosQ) * 180/Math.PI;
	}
	/***
	 * 
	 * @param x
	 * @return
	 */
	public static int dcmp(double x) {
        //判断数的精度
        if (Math.abs(x) < eps) return 0;
        return (x > 0) ? 1 : -1;
    }
	public double getX() {
		return x;
	}
	public void setX(double x) {
		this.x = x;
	}
	public double getY() {
		return y;
	}
	public void setY(double y) {
		this.y = y;
	}
}
